/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.ces4.produccion.client.usuario;

import co.com.ces4.client.baseView.CreateBase;
import co.com.ces4.produccion.client.UsuarioService;
import co.com.ces4.produccion.client.UsuarioServiceAsync;
import co.com.ces4.produccion.client.utils.Loader;
import co.com.ces4.produccion.jpa.entities.OrdenProduccion;
import co.com.ces4.produccion.jpa.entities.Perfil;
import co.com.ces4.produccion.jpa.entities.SolicitudProduccion;
import co.com.ces4.produccion.jpa.entities.Usuario;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.util.BooleanCallback;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Button;
import com.smartgwt.client.widgets.Dialog;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.PasswordItem;
import com.smartgwt.client.widgets.form.fields.RadioGroupItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.Layout;
import com.smartgwt.client.widgets.layout.SectionStackSection;
import java.util.ArrayList;
import java.util.LinkedHashMap;

/**
 *
 * @author Sebastian
 */
public class EdicionUsuario extends CreateBase {

    private TextItem txtIdUsuario, txtNombreUsuario, txtApellido1, txtApellido2, txtLoginUsuario;
    private PasswordItem password;
    private RadioGroupItem usuarioStatusRg;
    private DynamicForm frmAdministracionUsuario;
    private Button btnGuardar, btnLimpiar;
    private SectionStackSection stsAdministracionUsuario;
    private HLayout hlyAccionesAdministracionUsuario;
    private Usuario usuario;

    public EdicionUsuario() {
        super("Usuario", "100%");
        stsAdministracionUsuario = new SectionStackSection();
        stsAdministracionUsuario.setShowHeader(false);
        stsAdministracionUsuario.setCanCollapse(false);
        stsAdministracionUsuario.setExpanded(true);

        frmAdministracionUsuario = new DynamicForm();
        frmAdministracionUsuario.setWidth100();
        frmAdministracionUsuario.setNumCols(4);

        txtIdUsuario = new TextItem("txtIdUsuario", "Identificación");
        txtIdUsuario.setRequired(true);
        txtIdUsuario.setLength(20);

        txtNombreUsuario = new TextItem("txtNombreUsuario", "Nombre");
        txtNombreUsuario.setRequired(true);
        txtNombreUsuario.setLength(50);

        txtApellido1 = new TextItem("txtApellido1", "Apellido 1");
        txtApellido1.setRequired(true);
        txtApellido1.setLength(20);

        txtApellido2 = new TextItem("txtApellido2", "Apellido 2");
        txtApellido2.setLength(20);

        txtLoginUsuario = new TextItem("txtLoginUsuario", "Nombre de usuario");
        txtLoginUsuario.setRequired(true);
        txtLoginUsuario.setLength(150);

        password = new PasswordItem("password", "Contraseña");
        password.setRequired(true);
        password.setLength(30);

        usuarioStatusRg = new RadioGroupItem("usuarioStatus", "Estado");
        usuarioStatusRg.setVertical(false);
        usuarioStatusRg.setRequired(true);
        LinkedHashMap<String, String> statusOption = new LinkedHashMap<String, String>();
        statusOption.put("a", "Activo");
        statusOption.put("i", "Inactivo");
        usuarioStatusRg.setValueMap(statusOption);

        btnGuardar = new Button("Guardar");
        btnGuardar.addClickHandler(new ClickHandler() {

            public void onClick(ClickEvent event) {
                guardarUsuario();
            }
        });
        btnLimpiar = new Button("Limpiar");
        btnLimpiar.addClickHandler(new ClickHandler() {

            public void onClick(ClickEvent event) {
                frmAdministracionUsuario.clearValues();
            }
        });

        hlyAccionesAdministracionUsuario = new HLayout();
        hlyAccionesAdministracionUsuario.setMargin(15);
        hlyAccionesAdministracionUsuario.setAlign(Alignment.CENTER);
        hlyAccionesAdministracionUsuario.addMember(btnGuardar);
        hlyAccionesAdministracionUsuario.addMember(btnLimpiar);
        hlyAccionesAdministracionUsuario.setMembersMargin(15);
        setSectionContainerItems(hlyAccionesAdministracionUsuario);

        frmAdministracionUsuario.setItems(txtIdUsuario, txtNombreUsuario, txtApellido1, txtApellido2, txtLoginUsuario, password, usuarioStatusRg);
        stsAdministracionUsuario.addItem(frmAdministracionUsuario);
        addSection(stsAdministracionUsuario);
    }

    public EdicionUsuario(final Usuario usuario) {
        this();
        this.usuario = usuario;
        setSectionTitle(0, "Editar Usuario");
        txtIdUsuario.setValue(usuario.getDsid());
        txtNombreUsuario.setValue(usuario.getDsnombre());
        txtApellido1.setValue(usuario.getDsapellido1());
        if (usuario.getDsapellido2() != null) {
            txtApellido2.setValue(usuario.getDsapellido2());
        }
        txtLoginUsuario.setValue(usuario.getDsusuario());
        password.setValue(usuario.getDspassword());
        txtIdUsuario.setDisabled(true);
        btnLimpiar.setDisabled(true);
        if (usuario.getSnestado()) {
            usuarioStatusRg.setValue("a");
        } else {
            usuarioStatusRg.setValue("i");
        }
    }

    private void guardarUsuario() {
        if (frmAdministracionUsuario.validate()) {
            if (usuario == null) {
                Loader.showLoader();
                final Usuario tmp = getUsuario();
                AsyncCallback<Void> registrarCallback = new AsyncCallback<Void>() {

                    @Override
                    public void onFailure(Throwable caught) {
                        SC.warn("Error", caught.getMessage(), new BooleanCallback() {

                            @Override
                            public void execute(Boolean value) {
                            }
                        }, new Dialog());
                        usuario = null;
                        Loader.hideLoader();
                    }

                    @Override
                    public void onSuccess(Void result) {
                        usuario = tmp;
                        btnLimpiar.setDisabled(true);
                        SC.say("Señor usuario, el registro fue guardado correctamente");
                        final ConsultarUsuario cu = new ConsultarUsuario();
                        EdicionUsuario.this.hide();
                        cu.setLayoutData("Consultar Usuarios");
                        ((Layout) EdicionUsuario.this.getParentElement()).addMember(cu);
                        Loader.hideLoader();
                    }
                };
                getUsuarioService().guardarUsuario(tmp, registrarCallback);
            } else {
                final Usuario tmp = getUsuario();
                AsyncCallback<Void> actualizarCallback = new AsyncCallback<Void>() {

                    @Override
                    public void onFailure(Throwable caught) {
                        SC.warn("Error", caught.getMessage(), new BooleanCallback() {

                            @Override
                            public void execute(Boolean value) {
                            }
                        }, new Dialog());
                        Loader.hideLoader();
                    }

                    @Override
                    public void onSuccess(Void result) {
                        usuario = tmp;
                        SC.say("Señor usuario, el registro fue actualizado correctamente");
                        final ConsultarUsuario cu = new ConsultarUsuario();
                        EdicionUsuario.this.hide();
                        cu.setLayoutData("Consultar Usuarios");
                        ((Layout) EdicionUsuario.this.getParentElement()).addMember(cu);
                        Loader.hideLoader();
                    }
                };
                getUsuarioService().actualizarUsuario(tmp, actualizarCallback);
            }
        }
    }

    private Usuario getUsuario() {
        if (usuario == null) {
            usuario = new Usuario();
            usuario.setOrdenProduccionList(new ArrayList<OrdenProduccion>());
            usuario.setPerfilList(new ArrayList<Perfil>());
            usuario.setSolicitudProduccionList(new ArrayList<SolicitudProduccion>());
        }

        usuario.setDsid(txtIdUsuario.getValueAsString());
        usuario.setDsnombre(txtNombreUsuario.getValueAsString());
        usuario.setDsapellido1(txtApellido1.getValueAsString());
        if (txtApellido2 != null) {
            usuario.setDsapellido2(txtApellido2.getValueAsString());
        } else {
            usuario.setDsapellido2("");
        }
        usuario.setDsusuario(txtLoginUsuario.getValueAsString());
        usuario.setDspassword(password.getValueAsString());

        if (usuarioStatusRg.getValueAsString().equals("a")) {
            usuario.setSnestado(true);
        } else {
            usuario.setSnestado(false);
        }

        return usuario;
    }

    private UsuarioServiceAsync getUsuarioService() {
        return GWT.create(UsuarioService.class);
    }
}
